#include<memory.h>
#include<stdlib.h>
#include<stdio.h>
#include"pageread-predictor.h"

//这里是一个普通的段预读策略分别进行将这个函数每次传入一个当前的访问节点，然后自己维护一定数量的历史记录
//我们通过判断当前访问的节点在不在之前预测的块中来判断当前要预读的数量



/**
 *一个形参，第一个形参是返回值，是指向一个数组的指针
 *这个数组带外部就已经分配好空间，是一个20位的缓冲区
 *我们需要将预测序列填满，并且向外传出有效空间的大小
 **/


//这里是传统页预测器的初始化函数
void page_init(page_predictor_t* predictor){
    printf("初始化页顺序预测器\n");

    predictor->size = 0;

    predictor->last_access = -1;
}


void page_predictor(page_predictor_t* predictor, long now_access, long *predictor_arr, int *size){
    if(predictor_arr == NULL){
        printf("predictor_arr必须在外部分配好空间、\n");
        return;
    }
    
    // printf("开始进行page顺序预测，now_access = %ld\n", now_access);
    //开始预测，看看之前的预测是不是对的
    //查看之前的预测结果
    int i;

    if(predictor->last_access +  1 == now_access){
        if(predictor->size == 0){
            predictor->size = 1;
        }else{
            predictor->size = predictor->size * 2;

            if(predictor->size > 32){
                predictor->size = 32;
            }
        }
    }else{
        predictor->size = 0;
    }

    //要返回的块编号的数量
    // if(last_access + 1 != now_access){
    //     return_num = 0;
    //     *size = return_num; 
    //     return;
    // }

    // printf("开始预测\n");

    // for(i = 0; i < MAX_HISTORY_ARR_SIZE; i++){
    //     //开始检查上一次预测的记录
    //     if(predictor->history_arr[i] == now_access){
    //         //这里说明这个块是上次预测到的
    //         return_num = 6;
    //         break;
    //     }
    // }

    //如果没有预测到，那就依旧返回三个，如果预测到了那就返回6个
    for(i = 0; i < predictor->size; i++){
        predictor_arr[i] = now_access + i + 1;
    }

    predictor->last_access = now_access;

    *size = predictor->size; 
}